//二进制手表顶部有 4 个 LED 代表 小时（0-11），底部的 6 个 LED 代表 分钟（0-59）。每个 LED 代表一个 0 或 1，最低位在右侧。
//
//
//
// 例如，下面的二进制手表读取 "3:25" 。
//
//
//
//
// （图源：WikiMedia - Binary clock samui moon.jpg ，许可协议：Attribution-ShareAlike 3.0
//Unported (CC BY-SA 3.0) ）
//
// 给你一个整数 turnedOn ，表示当前亮着的 LED 的数量，返回二进制手表可以表示的所有可能时间。你可以 按任意顺序 返回答案。
//
// 小时不会以零开头：
//
//
// 例如，"01:00" 是无效的时间，正确的写法应该是 "1:00" 。
//
//
// 分钟必须由两位数组成，可能会以零开头：
//
//
// 例如，"10:2" 是无效的时间，正确的写法应该是 "10:02" 。
//
//
//
//
// 示例 1：
//
//
//输入：turnedOn = 1
//输出：["0:01","0:02","0:04","0:08","0:16","0:32","1:00","2:00","4:00","8:00"]
//
//
// 示例 2：
//
//
//输入：turnedOn = 9
//输出：[]
//
//
//
//
// 提示：
//
//
// 0 <= turnedOn <= 10
//
//
// Related Topics 位运算 回溯与递归 👍 406 👎 0


//leetcode submit region begin(Prohibit modification and deletion)
// 仿全排列
function readBinaryWatch(turnedOn: number): string[] {

    function backtracking(startIndex,temp) {

        //? set
        if (temp.filter((item) => item !== 0).length === turnedOn) {
            let min : number = 0
            let sec : number = 0
            for (let i = 0; i < 10; i ++) {
                if (i < 4) {
                    min += temp[i]
                }
                else {
                    sec += temp[i]
                }
            }
            if (min >= 12) return;
            if (sec >= 60) return;
            set.add(min + ':' + (sec < 10 ? '0' + sec : sec))
            return
        }
        for (let i = startIndex; i < 10; i ++) {
            temp[i] = arr[i]
            backtracking(i + 1, temp)
            temp[i] = 0
        }
    }
    //? set去重
    let set : Set<string> = new Set<string>()
    const min = [1,2,4,8]
    const sec = [1,2,4,8,16,32]
    //? 全排列方式
    const arr = [...min,...sec]
    //? 为什么要把长度指定 且要赋0？因为需要通过位置知道属于分还是秒
    backtracking(0,new Array(10).fill(0))
    return Array.from(set)
};
//leetcode submit region end(Prohibit modification and deletion)
